﻿/*
 * Created by SharpDevelop.
 * User: Lousabit
 * Date: 31/10/2011
 * Time: 3:06
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Business_Entity;
using Business_Logic;

namespace PetSoft.GUI.Ventas
{
	/// <summary>
	/// Description of GUIDescuento.
	/// </summary>
	public partial class GUIDescuentoProducto : Form
	{
		private BEDescuento descuento;
		private List<BECategoriaCliente> categorias;
		private bool cambiarGrillaPadre;
		
		public GUIDescuentoProducto(BEDescuento d)
		{
			try{
				InitializeComponent();
				
				this.cambiarGrillaPadre = false;
				
				this.descuento = d;
				if (this.descuento == null){
					this.descuento = new BEDescuento(-1);
					
					agregarProductoBTN.Enabled = true;
					aceptarBTN.Enabled = true;
					eliminarProductoBTN.Enabled = true;
					desdeDTP.Enabled = true;
					hastaDTP.Enabled = true;
					descuentoTB.Enabled = true;
					cantidadMinimaTB.Enabled = true;
					cantidadMaximaTB.Enabled = true;
					agregarServicioBTN.Enabled = true;
					eliminarServicioBTN.Enabled = true;
					
					categoriasDGV.Enabled = true;
					productosDGV.Enabled = true;
					serviciosDGV.Enabled = true;
					descripcionTB.Enabled = true;
				}else{
					//es un VER descuento
					desdeDTP.Value = descuento.Desde;
					hastaDTP.Value = descuento.Hasta;
					descuentoTB.Text= descuento.Descuento.ToString();
					cantidadMinimaTB.Text = descuento.CantidadMinima.ToString();
					cantidadMaximaTB.Text = descuento.CantidadMaxima.ToString();
					descripcionTB.Text = descuento.Descripcion;
				}
			}catch(Exception ex){
				Utils.MessageError("Error al construir la ventana.", ex);
			}
		}
		
		public bool CambiarGrillaPadre{
			get{return this.cambiarGrillaPadre;}
		}
		
		void GUIDescuentoLoad(object sender, EventArgs e)
		{
			cargarGridProductos();
			cargarGridCategorias();
			cargarGridServicios();

			try{
				BLServicio bl = new BLServicio();
				tipoServicioCB.DataSource = bl.getTipoServicio();
				tipoServicioCB.DisplayMember= "Nombre";
				
			}catch(Exception ex){
				Utils.MessageError("Error al cargar la ventana.", ex);
			}
			
		}
		
		private void cargarGridServicios(){
			try{
				serviciosDGV.Rows.Clear();
				
				foreach(BEServicio s in descuento.Servicios){
					serviciosDGV.Rows.Add();
					DataGridViewRow row = serviciosDGV.Rows[serviciosDGV.Rows.Count-1];
					row.Cells["Servicio"].Value = s.Descripcion.ToUpper();
					row.Cells["Codigoxx"].Value = s.Codigo;
					row.Cells["XNX"].Value = descuento.Servicios.IndexOf(s);
				}
				
				cantidadServLBL.Text = descuento.Servicios.Count + " servicios";
			}catch(Exception ex){
				Utils.MessageError("Error al cargar la lista de servicios.", ex);
			}
		}
		
		private void cargarGridProductos(){
			try{
				
				productosDGV.Rows.Clear();
				
				foreach(BEProducto p in descuento.Productos){
					productosDGV.Rows.Add();
					DataGridViewRow row = productosDGV.Rows[productosDGV.Rows.Count-1];
					row.Cells["Producto"].Value = p.Nombre;
					row.Cells["Codigo"].Value = p.Codigo;
					row.Cells["NX"].Value = descuento.Productos.IndexOf(p);
				}
				
				cantidadProdLBL.Text = descuento.Productos.Count + " productos";
				
			}catch(Exception ex){
				Utils.MessageError("Error al cargar la lista de productos.", ex);
			}
		}
		
		private void cargarGridCategorias(){
			
		
			
			try{
				
				categoriasDGV.Rows.Clear();
				
				BLCategoriaCliente blCat = new BLCategoriaCliente();
				categorias = blCat.obtenerCategoriaCliente();
				foreach(BECategoriaCliente p in categorias){
					
					if (p.IdCategoria < 0) continue;
					
					categoriasDGV.Rows.Add();
					DataGridViewRow row = categoriasDGV.Rows[categoriasDGV.Rows.Count-1];
					row.Cells["Categoria"].Value = p.Nombre;
					row.Cells["Codigox"].Value = p.IdCategoria;
					row.Cells["N"].Value = categorias.IndexOf(p);
					
					if (descuento.tieneCategoria(p)){
						row.Cells["Aplica"].Value = true;
					}else{
						row.Cells["Aplica"].Value = false;
					}
					
				}
				
				cantidadProdLBL.Text = descuento.Productos.Count + " elementos";
				
			}catch(Exception ex){
				Utils.MessageError("Error al cargar la lista de categorías.", ex);
			}
		}
		
		private void agregarProducto(BEProducto p){
			if (p == null){
				Utils.MessageAviso("El producto no puede ser nulo.");
				return;
			}else{
				if (descuento.tieneProducto(p)){
					Utils.MessageAviso("El producto "+ p.Nombre +" ya está en el descuento");
					return;
				}else{
					descuento.agregarProducto(p);
				}
			}
		}
		
		private void agregarServicio(BEServicio s){
			if (s == null){
				Utils.MessageAviso("El servicio no puede ser nulo.");
				return;
			}else{
				if (descuento.tieneServicio(s)){
					Utils.MessageAviso("El servicio "+ s.Descripcion +" ya está en el descuento.");
					return;
				}else{
					descuento.agregarServicio(s);
				}
			}
		}
		
		private void agregarProductos(List<BEProducto> productos){
			foreach(BEProducto p in productos){
				agregarProducto(p);
			}
			
			cargarGridProductos();
		}
		
		private void agregarServicios(List<BEServicio> servicios){
			foreach(BEServicio s in servicios){
				agregarServicio(s);
			}
			cargarGridServicios();
		}
		
		void AgregarProductoBTNClick(object sender, EventArgs e)
		{
			try{
				PetSoft.GestionRecursos.MProductos v = new PetSoft.GestionRecursos.MProductos(2);
				v.ShowDialog(this);
				
				if (v.getProductosSeleccionados() == null) return;
				agregarProductos(v.getProductosSeleccionados());
				
			}
			catch(Exception ex){
				Utils.MessageError("Error al agregar producto.", ex);
			}
			
		}
		
		void Label2Click(object sender, EventArgs e)
		{
			
		}
		
		void EliminarBTNClick(object sender, EventArgs e)
		{
			try{
				List<int> indicesEliminar = new List<int>();
				
				foreach(DataGridViewRow row in productosDGV.Rows){
					if (row.Cells["Eliminar"].Value != null && (Boolean)row.Cells["Eliminar"].Value == true){
						indicesEliminar.Add((int)row.Cells["NX"].Value);
					}
				}
				
				if (indicesEliminar.Count == 0){
					//MessageBox.Show("Debe seleccionar por lo menos una fila a eliminar.");
					return;
				}
				
				descuento.borrarProductosIndice(indicesEliminar);
			}
			catch(Exception ex){
				Utils.MessageError("Error al eliminar productos.", ex);
			}
			
			cargarGridProductos();
			
		}
		
		void AceptarBTNClick(object sender, EventArgs e)
		{
			
			bool sinCategorias = true;
			
			try{
				if (!Utils.MessagePregunta("¿Realmente desea crear el descuento con los datos ingresados?")){
					return;
				}
			}catch(Exception ex){
				Utils.MessageError("Error intentar crear descuento.", ex);
				return;
			}
			
			try{
				String desc = descripcionTB.Text;
				if (desc == ""){
					Utils.MessageAviso("La descripción no puede ser vacía");
					return;
				}
				descuento.Descripcion = desc;
			}catch(Exception ex){
				Utils.MessageAviso("La descripción es inválida", ex);
				return;
			}
			
			try{
				List<int> indAplica = Utils.getCheckedIndexes(categoriasDGV, "Aplica", "N");
				List<BECategoriaCliente> categoriasAplica = new List<BECategoriaCliente>();
				
				foreach(int i in indAplica){
					categoriasAplica.Add(categorias[i]);
				}
				descuento.Categorias = categoriasAplica;
				
				if (indAplica == null || indAplica.Count > 0) sinCategorias = false;
				
			}catch(Exception ex){
				Utils.MessageError("Error al obtener información de categorías.", ex);
				return;
			}
			
			try{
				descuento.Desde = desdeDTP.Value;
				descuento.Hasta = hastaDTP.Value;
			}catch(Exception ex){
				Utils.MessageError("Error al obtener información de fechas.", ex);
				return;
			}
			
			try{
				descuento.Descuento = double.Parse(descuentoTB.Text);
			}catch(Exception ex){
				Utils.MessageAviso("El porcentaje de descuento no es válido.", ex);
				return;
			}
			
			try{
				descuento.CantidadMinima = int.Parse(cantidadMinimaTB.Text);
				if (descuento.CantidadMinima < 0){
					Utils.MessageAviso("La cantidad mínima debe ser mayor o igual que 0");
					return;
				}
			}catch(Exception ex){
				Utils.MessageAviso("La cantidad mínima no es válida.", ex);
				return;
			}
			
			try{
				
				if (cantidadMaximaTB.Text.Equals("")){
					descuento.CantidadMaxima = -1;
				}else{				
					descuento.CantidadMaxima = int.Parse(cantidadMaximaTB.Text);
					if (descuento.CantidadMaxima < descuento.CantidadMinima){
						Utils.MessageAviso("La cantidad máxima debe ser mayor o igual que la cantidad mínima.");
						return;
					}
				}
			}catch(Exception ex){
				Utils.MessageAviso("La cantidad máxima no es válida.", ex);
				return;
			}
			
			try{
				
				if (descuento.Productos == null || descuento.Servicios == null ||
				    descuento.Productos.Count + descuento.Servicios.Count == 0){
					Utils.MessageAviso("El descuento debe tener por lo menos un producto o un servicio.");
					return;
				}
				
				if (sinCategorias){
					Utils.MessageAviso("El descuento debe aplicarse por lo menos a una categoría de cliente.");
					return;
				}
				
				BLDescuento.insert(descuento);

				if (this.descuento.Id != -1){
					this.cambiarGrillaPadre = true;					
				}
				
				Utils.MessageInformation("Se ha creado el descuento correctamente.");
				
				this.Close();
			}catch(Exception ex){
				Utils.MessageError("Error al intentar crear nuevo descuento.", ex);
				return;
			}
			
			this.cambiarGrillaPadre = true;
			
		}
		
		void DescuentoTBTextChanged(object sender, EventArgs e)
		{
			
		}
		
		void DescuentoTBKeyPress(object sender, KeyPressEventArgs e)
		{
			try{
				Utils.SoloNumerosTB(sender, e);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Descuento.", ex);
			}
		}
		
		void CantidadMinimaTBKeyPress(object sender, KeyPressEventArgs e)
		{
			try{
				Utils.SoloNumerosTB(sender, e);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Cantidad Mínima.", ex);
			}
		}
		
		void TipoServicioCBSelectedIndexChanged(object sender, EventArgs e)
		{
			try{
				BLServicio bl = new BLServicio();
				servicioCB.DataSource = bl.getServicios((BETipoServicio)(tipoServicioCB.SelectedValue));
				servicioCB.DisplayMember = "Descripcion";
			}catch(Exception ex){
				Utils.MessageError("Error al cargar lista de servicios.", ex);
			}
		}
		
		void AgregarServicioBTNClick(object sender, EventArgs e)
		{
			try{
				BEServicio servicioSeleccionado = (BEServicio)servicioCB.SelectedValue;
				if (servicioSeleccionado.Codigo != -1){
					this.agregarServicio(servicioSeleccionado);
					cargarGridServicios();
				}
			}catch(Exception ex){
				Utils.MessageError("Error al agregar servicio.", ex);
			}
		}
		
		void ServiciosDGVCellContentClick(object sender, DataGridViewCellEventArgs e)
		{
			
		}
		
		void EliminarServicioBTNClick(object sender, EventArgs e)
		{
			try{
				List<int> ind = Utils.getCheckedIndexes(serviciosDGV,"Eliminarx","XNX");
				descuento.borrarServiciosIndice(ind);
			}catch(Exception ex){
				Utils.MessageError("Error al eliminar servicio.", ex);
			}
			cargarGridServicios();
		}
		
		void CantidadProdLBLClick(object sender, EventArgs e)
		{
			
		}
		
		void DatosGBEnter(object sender, EventArgs e)
		{
			
		}
		
		void CantidadMaximaTBKeyPress(object sender, KeyPressEventArgs e)
		{
			try{
				Utils.SoloNumerosTB(sender, e);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Cantidad Máxima.", ex);
			}
		}
		
		void DesdeDTPValueChanged(object sender, EventArgs e)
		{
			try{
				Utils.dateMayorQueNow(sender, e);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Desde.", ex);
			}
		}
		
		void HastaDTPValueChanged(object sender, EventArgs e)
		{
			try{
				Utils.dateMayorQue(hastaDTP, desdeDTP);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Hasta.", ex);
			}
		}
		

		
		void DescripciónTBKeyPress(object sender, KeyPressEventArgs e)
		{
			try{
				Utils.NoCaracteresRarosTB(sender, e);
				Utils.ForzarMayusculasTB(sender, e);
			}catch(Exception ex){
				Utils.MessageError("Error al validar campo Descripción", ex);
			}
		}
		
		void CategoriasCHBCheckedChanged(object sender, EventArgs e)
		{
			try{
				Utils.seleccionarTodo(categoriasDGV,sender, "Aplica");
			}catch(Exception ex){
				Utils.MessageError("Error al seleccionar categorías.", ex);
			}
		}
	}
}
